﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Biblioteca.Models;
using System.Data;
using Biblioteca.Interfaces;

namespace Biblioteca.Controllers
{
    public class DespachoController : Controller
    {
        private BibliotecaStore db;
        private IPrestamo PrestamoRepo;
        private IReserva ReservaRepo;
        private ICuentaUsuario CuentaRepo;
        private IEjemplar ejemplarRepo;

        public DespachoController(IPrestamo pr,IReserva rr,ICuentaUsuario cr,IEjemplar er, BibliotecaStore data)
        {
            this.PrestamoRepo = pr;
            this.ReservaRepo = rr;
            this.CuentaRepo = cr;
            this.ejemplarRepo = er;
            this.db = data;
        }
        //
        // GET: /Despacho/

        public ActionResult Index()
        {

            ViewBag.Socios = new SelectList(db.CuentaUsuarios.Where(m => m.Usuario1.Tipo == 2).OrderBy(m => m.Cuenta1.Usuario).Select(t => t.Cuenta1), "idCuenta", "Usuario");

            ViewBag.Materiales = new SelectList(db.Materials, "idMaterial", "Titulo");
            return View();
        }
        public ActionResult find(FormCollection form)
        {
            try
            {

                var idcuenta = int.Parse(form.Get("Socios"));
                var idMaterial = int.Parse(form.Get("Materiales"));

                //recupero el usuario asociado a la cuenta
                //recupero el id del usuario asociado a la cuenta
                int idUsuario = CuentaRepo.getID(idcuenta);

                //busco la cantidad de ejemplares disponibles del usuario
                int dispobilibildad = this.ejemplarRepo.disponibilidadMaterial(idMaterial);

                if (dispobilibildad > 0)
                {
                    //se puede aun realizar el despacho
                    //recupero la cantidad de libros prestados al usuario
                    int prestados = PrestamoRepo.cantPrestamosUsuario(idUsuario);
                    if (prestados < 3)
                    {
                        //sigue pudiendo despachar
                        int reservasActivas = ReservaRepo.obtenerReservaDisponibilidadUsuarioMaterial(idMaterial, dispobilibildad, idUsuario);

                        if (reservasActivas == 1)
                        {
                            Reserva reservaUsuario = ReservaRepo.obtenerPrimerReservaDisponibilidad(idMaterial, dispobilibildad, idUsuario);
                            //obtener el primer ejemplar disponible
                            Ejemplar ejemplarDisponible = ejemplarRepo.obtenerPrimerDisponible(idMaterial);
                            //PARCHEEEEEEE
                            int maxID = PrestamoRepo.getMaxID();
                            //creo el prestamos
                            Prestamo nuevoPrestamo = new Prestamo();
                            nuevoPrestamo.IdPrestamo = maxID;
                            nuevoPrestamo.FechaDevolucion = DateTime.Today.AddDays(reservaUsuario.Dias);
                            nuevoPrestamo.Usuario = idUsuario;
                            nuevoPrestamo.Material = idMaterial;
                            nuevoPrestamo.Ejemplar = ejemplarDisponible.Codigo;
                            //actualizo la reserva
                            reservaUsuario.Estado = 4; //paso a estar terminada
                            //actualizar el ejemplar
                            ejemplarDisponible.Disponible = 0;
                            //guardo los datos en BD
                            PrestamoRepo.crearPrestamos(nuevoPrestamo);
                            ReservaRepo.cancelarReserva(reservaUsuario); //en este caso significa que la reserva cambio de estado, pero no que se elimino
                            ejemplarRepo.modificarEjemplar(ejemplarDisponible);

                            ViewBag.Ejemplar = ejemplarDisponible;
                            return View("Exitoso", nuevoPrestamo);
                        }
                        else
                        {
                            //no hay cantidad de ejemplares suficientes
                            // ejemplo: 2 ejemplares disponible y el numero de reserva esta desde la tercera posicion en adelante
                            ViewBag.Estado = "La cantidad de ejemplares disponibles ya han sido reservados con anterioridad o el usuario no ha realizado una reserva";
                        }
                        

                    }
                    else
                    {
                        //no puede despachar
                        ViewBag.Estado = "El usuario ya cuenta con 3 ejemplares despachados";
                    }

                }
                else
                {
                    //no hay ejemplares disponibles
                    ViewBag.Estado = "No hay ejemplares dispobibles aun";
                }
                return View("Resultado");
            }
            catch
            {
                return View("Index");
            }
        }

        public ActionResult Activos(int id)
        {
            var pr = PrestamoRepo.getActivos(id);

            return View(pr);
        }
        public ActionResult Antiguos(int id)
        {
            var ant = PrestamoRepo.getAntiguos(id);
            return View(ant);
        }
        public ActionResult Vencimientos()
        {
            var venc = PrestamoRepo.getVencimientos();
            return View(venc);
        }
        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

    }
}
